Gesture Recognizer
概要
Gesture Recognizer オブジェクト、ないし Gesture Recognizer とは、タッチの連続、あるいはその他の入力の検知 (recognize) 及びそれに応じて別の処理を呼び出すような部分とロジックを分離させる。
Gesture Recognizer によって特定のジェスチャーが検知された場合、予め設定されたターゲットのオブジェクトに Action Message が送信される。あるいは、UIGestureRecognizerDelegate プロトコルに準拠したオブジェクトを delegate に登録し、より詳細な振る舞いのカスタマイズ もできる。
https://developer.apple.com/documentation/uikit/uigesturerecognizer
Action Method
Gesture Recognizer は、1つ以上の Target-Action ペアと関連づけられる。Action Method は以下のいずれかの I/F が許可されている。
また、Gesture Recognizer にはその種類は大きく 連続 (continuous) と 離散 (discrete) に分類される。後者はダブルタップなどで、その動作完了時に一回 Action Method が呼び出されるが、前者は画面の回転などの連続した処理であり、処理が完了するまで値が変わり続ける度に Action Method が呼び出される。
code:swift
@IBAction func myActionMethod()
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)
Gesture Recognizer の振る舞い
タッチ情報送信のキャンセル
View はタッチ情報を、touchesBegan(_:with:) や touchesMoved(_:with:) で得ることができるが、View に Gesture Recognizer が紐づいており、なおかつジェスチャーが検知された場合には、デフォルトだとそれらのメソッドへのタッチ情報の送信は window から行われず、キャンセルされる。このキャンセルが発生した場合には、touchesCancelled(_:with:) が呼び出される。この設定は Gesture Recognizer 側の cancelsTouchesInView で切り替えることができる。
タッチ情報送信の遅延
タッチが行われ、タッチ情報が Gesture Recognizer によってジェスチャーとして検知されるまでの間に、ジェスチャーとして検知されていない状態のタッチ情報の送信を遅延させることができる。これらは Gesture Recognizer 側の delaysTouchesBegan, delaysTouchesEnded で設定でき、デフォルトだと後者がオフ、前者はオンになっている。この設定がオフだと、ジェスチャーが検知されるまでタッチ情報は View に送信され続け、ジェスチャー検知時点で送信がキャンセルされ情報が送信されなくなる。一方でこの設定がオンだと、ジェスチャーの検知が終了、すなわちそのタッチ動作がジェスチャーかどうか決定するまで、タッチ情報の送信が遅延される。
例えば delaysTouchesBegan がオンであり、Gesture Recognizer がパン動作 (ドラッグ) を検知するとする。この場合、シングルタップをした上で画面に指を乗せたままだと、そのあとパン動作が行われるかもしれないので、この時点ではジェスチャーかどうか検知できない。この場合、このタイミングでは View にタッチ情報は送信されない。そして、そのまま指が画面から離されると、もうパン動作はできないので、そこで初めてタッチ情報が View に送信される。設定がオフの場合には、タッチ時点でタッチ情報が View に送信され、遅延はない。
サブクラス化
UIGestureRecognizerSubclass.h ヘッダをインポートすべき
詳しくは割愛
Delegate
UIGestureRecognizerDelegate プロトコルに準拠したオブジェクトを delegate として登録できる。これにより、Gesture Recognizer の操作に影響を与えたり、他の Gesture Recognizer との関連を定義したりできる。
公式ドキュメントでは、画面端からのパンジェスチャーを利用する場合、他の View での Gesture Recognizer を全て動的に失敗させるような例が載っている。
https://developer.apple.com/documentation/uikit/uigesturerecognizerdelegate
その他
下記の公式ドキュメントが充実している。
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures